package edu.pe.cayetano.wsusuario.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.wsusuario.constantes.Constantes;
import edu.pe.cayetano.wsusuario.framework.DAOException;
import edu.pe.cayetano.wsusuario.to.WSCabeceraUsuarioTO;
import edu.pe.cayetano.wsusuario.to.WSUsuarioTO;


public class UsuarioDAO extends BaseDAO{


	public UsuarioDAO(Connection cnx) {
		super(cnx);
	}

	/**
	 * Metodo para obtener los datos de un usuario dado su username
	 * */
	public BResult getUsuario(WSCabeceraUsuarioTO cabeceraUsuarioTO) throws Exception {

		String 					schema			= "DBUSERS.";
		PreparedStatement   	pstmt 		 	= null;
		ResultSet 				rs 			 	= null;
		ResultSet 				rs2 		 	= null;
		BResult					ret 			= new BResult();
		WSUsuarioTO				usuarioTO		= new WSUsuarioTO();;
		try{
			// consultando solamente por username
			StringBuffer query  = new StringBuffer();
			query.append(" SELECT COD_USUARIO, APE_PATERNO, APE_MATERNO, NOMBRE, USERNAME, PASSWORD, ESTADO_ID,COD_PERFIL");
			query.append(" FROM "+schema+"DBUSERS_USUARIO WHERE USERNAME=?");
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,cabeceraUsuarioTO.getUsername());
			System.out.println("[WSUsuario][UsuarioDAO][getUsuario]:querySQL:<"+query.toString()+">");
			
			rs=pstmt.executeQuery();

			// si el username existe, se consulta por username y password
			if(rs.next()){
				
				usuarioTO.setCodigo(rs.getString("COD_USUARIO"));			
				StringBuffer 			query2  = new StringBuffer();
				query2.append(" SELECT COD_USUARIO, APE_PATERNO, APE_MATERNO, NOMBRE, USERNAME, PASSWORD, ESTADO_ID,COD_PERFIL");
				query2.append(" FROM "+schema+"DBUSERS_USUARIO WHERE USERNAME=? AND PASSWORD=?");
				pstmt = getConnection().prepareStatement(query2.toString());
				pstmt.setString(1,cabeceraUsuarioTO.getUsername());
				pstmt.setString(2,cabeceraUsuarioTO.getPassword());
				System.out.println("[WSUsuario][UsuarioDAO][getUsuario]:querySQL:<"+query2.toString()+">");
				rs2=pstmt.executeQuery();
				// si existe el usuario y password
				if(rs2.next()){
					//usuarioTO.setCodigo(rs2.getString("COD_USUARIO"));
					usuarioTO.setApePaterno(rs2.getString("APE_PATERNO"));
					usuarioTO.setApeMaterno(rs2.getString("APE_MATERNO"));
					usuarioTO.setNombre(rs2.getString("NOMBRE"));
					usuarioTO.setUsername(rs2.getString("USERNAME"));
					usuarioTO.setPassword(rs2.getString("PASSWORD"));
					usuarioTO.setEstado(rs2.getString("ESTADO_ID"));
					usuarioTO.setPerfil(rs2.getString("COD_PERFIL"));
					ret.setObject(usuarioTO);
					ret.setCode(Constantes.CODIGO_EXITO);
					ret.setMessage(Constantes.MENSAJE_CODIGO_EXITO);
				}else{
					// si no existe coincidencia: el password es incorrecto
					//ret.setObject(null);
					System.out.println("[WSUsuario][UsuarioDAO][getUsuario]:codigo de respuesta : entrando a password incorrecto");
					ret.setObject(usuarioTO);
					ret.setCode(Constantes.CODIGO_PASSWORD_INCORRECTO);
					ret.setMessage(Constantes.MENSAJE_CODIGO_PASSWORD_INCORRECTO);
				}
			}else{
				// si no existe coincidencia: el usuario no existe
				ret.setObject(null);
				ret.setCode(Constantes.CODIGO_USUARIO_NO_EXISTE);
				ret.setMessage(Constantes.MENSAJE_CODIGO_USUARIO_NO_EXISTE);
			}
			System.out.println("ret.getCode():"+ret.getCode());
		}catch(SQLException e){
			System.out.println("[WSUsuario][UsuarioDAO][getUsuario]: sqlexception:"+e.getMessage());
			ret.setObject(null);
			ret.setCode(e.getErrorCode());
			ret.setMessage(e.getMessage());
		}catch(Exception e){
			System.out.println("[WSUsuario][UsuarioDAO][getUsuario]: exception:"+e.getMessage());
			ret.setObject(null);
			ret.setCode(Constantes.CODIGO_ERROR);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
				rs.close();
				if(rs2!=null){
					rs2.close();
				}
			}catch(Exception e){
				throw new DAOException(e.getMessage());
			}
		}
		System.out.println("[WSUSuario][UsuarioDAO][getUsuario]ret:<"+ret+">");
		System.out.println("[WSUSuario][UsuarioDAO][getUsuario]ret.getObject():<"+ret.getObject()+">");
		return ret;
	}

	/**
	 * Metodo para obtener el listado de todos los usuarios
	 * */
	public BResult getListaUsuario() throws Exception {

		String 								schema			= "DBUSERS.";
		WSUsuarioTO 						usuarioTO	 	= null;
		PreparedStatement   				pstmt 		 	= null;
		ResultSet 							rs 			 	= null;
		BResult								ret				= null;
		ArrayList<WSUsuarioTO>				listaUsuario	= new ArrayList<WSUsuarioTO>();
		try{
			StringBuffer query  = new StringBuffer();
			query.append(" SELECT A.COD_USUARIO,APE_PATERNO,APE_MATERNO,A.NOMBRE AS NOMBRE,USERNAME,PASSWORD,"); 
			query.append(" E.NOMBRE AS ESTADO,C.COD_PERFIL AS COD_PERFIL,C.NOMBRE AS PERFIL"); 
			query.append(" FROM "+schema+"DBUSERS_USUARIO A  INNER JOIN "+schema+"DBUSERS_PERFIL C ON A.COD_PERFIL=C.COD_PERFIL ");
			query.append(" INNER JOIN "+schema+"DBUSERS_ESTADO E ON E.ESTADO_ID=A.ESTADO_ID");
			System.out.println("[WSUsuario][UsuarioDAO][getListaUsuario]:querySQL:<"+query.toString()+">");
			pstmt = getConnection().prepareStatement(query.toString());
			rs=pstmt.executeQuery();
			ret = new BResult();
			
			while(rs.next()){
				usuarioTO = new WSUsuarioTO();
				usuarioTO.setCodigo(rs.getString("COD_USUARIO"));
				usuarioTO.setApePaterno(rs.getString("APE_PATERNO"));
				usuarioTO.setApeMaterno(rs.getString("APE_MATERNO"));
				usuarioTO.setNombre(rs.getString("NOMBRE"));
				usuarioTO.setUsername(rs.getString("USERNAME"));
				usuarioTO.setPassword(rs.getString("PASSWORD"));
				usuarioTO.setEstado(rs.getString("ESTADO"));
				usuarioTO.setTipoUsuario(rs.getString("COD_PERFIL"));
				usuarioTO.setPerfil(rs.getString("PERFIL"));
				listaUsuario.add(usuarioTO);
			}
			if(listaUsuario.size()>0){
				WSUsuarioTO [] arregloUsuario = new WSUsuarioTO[listaUsuario.size()];
				for(int i=0;i<listaUsuario.size();i++){
					arregloUsuario[i]= listaUsuario.get(i);
				}
				ret.setObject(arregloUsuario);
				ret.setMessage(Constantes.MENSAJE_CODIGO_EXITO);
				ret.setCode(Constantes.CODIGO_EXITO);
			}else{
				ret.setObject(null);
				ret.setCode(Constantes.CODIGO_LISTADO_USUARIO_NO_EXISTE);
				ret.setMessage(Constantes.MENSAJE_CODIGO_LISTADO_USUARIO_NO_EXISTE);
			}
		}catch(SQLException e){
			System.out.println("[WSUsuario][UsuarioDAO][getUsuario]: sqlexception:"+e.getMessage());
			ret = new BResult();
			ret.setCode(Constantes.CODIGO_ERROR);
			ret.setMessage(e.getMessage());
		}catch(Exception e){
			System.out.println("[WSUsuario][UsuarioDAO][getUsuario]: exception:"+e.getMessage());
			ret = new BResult();
			ret.setCode(Constantes.CODIGO_ERROR);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
				rs.close();
			}
			catch(Exception e){
				throw new DAOException(e.getMessage());
			}
		}
		return ret;
	}
	
	/**
	 * Metodo para obtener el listado de todos los usuarios
	 * */
	public BResult findUsuario(WSCabeceraUsuarioTO cabeceraTO) throws Exception {

		String 								schema			= "DBUSERS.";
		WSUsuarioTO 						usuarioTO	 	= null;
		PreparedStatement   				pstmt 		 	= null;
		ResultSet 							rs 			 	= null;
		BResult								ret				= null;
		ArrayList<WSUsuarioTO>				listaUsuario	= new ArrayList<WSUsuarioTO>();
		try{
			StringBuffer query  = new StringBuffer();
			query.append(" SELECT A.COD_USUARIO,APE_PATERNO,APE_MATERNO,A.NOMBRE AS NOMBRE,USERNAME,PASSWORD,"); 
			query.append(" E.NOMBRE AS ESTADO,C.COD_PERFIL AS COD_PERFIL,C.NOMBRE AS PERFIL"); 
			query.append(" FROM "+schema+"DBUSERS_USUARIO A  INNER JOIN "+schema+"DBUSERS_PERFIL C ON A.COD_PERFIL=C.COD_PERFIL ");
			query.append(" INNER JOIN "+schema+"DBUSERS_ESTADO E ON E.ESTADO_ID=A.ESTADO_ID");
			if(!"todos".equalsIgnoreCase(cabeceraTO.getCampo())){
				query.append(" WHERE UPPER("+cabeceraTO.getCampo()+") LIKE '%"+cabeceraTO.getCriterio().toUpperCase()+"%'");
			}
			System.out.println("[WSUsuario][UsuarioDAO][findUsuario]:querySQL:<"+query.toString()+">");
			pstmt = getConnection().prepareStatement(query.toString());
			rs=pstmt.executeQuery();
			ret = new BResult();
			
			while(rs.next()){
				usuarioTO = new WSUsuarioTO();
				usuarioTO.setCodigo(rs.getString("COD_USUARIO"));
				usuarioTO.setApePaterno(rs.getString("APE_PATERNO"));
				usuarioTO.setApeMaterno(rs.getString("APE_MATERNO"));
				usuarioTO.setNombre(rs.getString("NOMBRE"));
				usuarioTO.setUsername(rs.getString("USERNAME"));
				usuarioTO.setPassword(rs.getString("PASSWORD"));
				usuarioTO.setEstado(rs.getString("ESTADO"));
				usuarioTO.setTipoUsuario(rs.getString("COD_PERFIL"));
				usuarioTO.setPerfil(rs.getString("PERFIL"));
				listaUsuario.add(usuarioTO);
			}
			if(listaUsuario.size()>0){
				WSUsuarioTO [] arregloUsuario = new WSUsuarioTO[listaUsuario.size()];
				for(int i=0;i<listaUsuario.size();i++){
					arregloUsuario[i]= listaUsuario.get(i);
				}
				ret.setObject(arregloUsuario);
				ret.setMessage(Constantes.MENSAJE_CODIGO_EXITO);
				ret.setCode(Constantes.CODIGO_EXITO);
			}else{
				ret.setObject(null);
				ret.setCode(Constantes.CODIGO_LISTADO_USUARIO_NO_EXISTE);
				ret.setMessage(Constantes.MENSAJE_CODIGO_LISTADO_USUARIO_NO_EXISTE);
			}
		}catch(SQLException e){
			System.out.println("[WSUsuario][UsuarioDAO][findUsuario]: sqlexception:"+e.getMessage());
			ret = new BResult();
			ret.setCode(Constantes.CODIGO_ERROR);
			ret.setMessage(e.getMessage());
		}catch(Exception e){
			System.out.println("[WSUsuario][UsuarioDAO][findUsuario]: exception:"+e.getMessage());
			ret = new BResult();
			ret.setCode(Constantes.CODIGO_ERROR);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
				rs.close();
			}
			catch(Exception e){
				throw new DAOException(e.getMessage());
			}
		}
		return ret;
	}
}
